package io;


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 提高每次读写的数据量，减少实际读写的次数，可以提高读写效率。
 * 单字节读写是一种随机读写形式
 * 一组字节的读写是块读写形式。利用块读写形式可以提高读写效率
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        //创建一个文件输入流，用来从原文件中读取每个字节
        FileInputStream fis = new FileInputStream("javaSE/ppt.pptx");
        //创建一个文件输出流，用来向复制的文件中写入每个字节
        FileOutputStream fos = new FileOutputStream("javaSE/ppt_cp.pptx");
        /*
            java.io.InputStream上定义了块读取字节的操作:
            int read(byte[] data)
            一次性从流中读取给定的字节数组data的长度的字节量，并存入该字节数组中。
            返回的int值表达的是本次实际读取到的数据量。
            如果返回的int值为整数-1，则表达本次已经是流的末尾了，没有读取到任何数据。

         */

        /*
            java.io.OutputStream上定义了所有字节输出流都必须具备的块写操作:
            void write(byte[] data)
            一次性将给定的字节数组中所有字节写出。

            void write(byte[] data,int offset,int len)
            一次性将给定的data数组中从下标offset处开始的连续len个字节写出
         */

        int d=0;
        byte[] data = new byte[1024*10];//10kb

        long start = System.currentTimeMillis();
        while( (d = fis.read(data)) != -1 ){
            fos.write(data,0,d);
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕!耗时"+(end-start)+"ms");

        fos.close();
        fis.close();
    }
}

